/**
 *   74HC595: 移位寄存器, 2根电源+3根数据, 节省IO口
 *      OE:    output enable, 输出使能, 低电平有效
 *      RCLK:  register clock, 寄存器时钟, 每来1个上升沿, '左侧输入缓存'的数据会被搬运到'右侧输出缓存'
 *      SRCLR: serial clear, 串行数据清0, 低电平有效
 *      SRCLK: serial clock, 串行时钟, 每来1个上升沿, SER 的数据就向下移位输入1位到'左侧的输入缓存'
 *      SER:   serial data, 串行数据输入端
 *      QH':   多片级联
 */
#include <REGX52.H>

/**
 * 声明 74HC595 的操作位
 */
unsigned char SRCLR = 1;    //74HC595 的第10引脚
sbit SRCLK = P3^6;          //74HC595 的第11引脚
sbit RCLK1 = P3^5;          //74HC595 的第12引脚, RCLK 已经被定义过了
unsigned char OE = 0;       //74HC595 的第13引脚
sbit SER = P3^4;            //74HC595 的第14引脚

/**
 * 初始化
 */
void _74HC595_Init() {
    SRCLK = 0;
    RCLK1 = 0;
}

/**
 * 写1个字节的数据
 */
void _74HC595_WriteByte(unsigned char Byte) {
    static unsigned char i;
    for (i = 0; i < 8; i++) {
        //从高位往下取, 依次写入'左侧输入缓存'
        SER = Byte & (0x80 >> i);
        SRCLK = 1;
        SRCLK = 0;
    }
    RCLK1 = 1;
    RCLK1 = 0;
}
